#ifndef __GPIO_H__
#define __GPIO_H__
#include "stm32mp1xx_gpio.h"
#define  RCC_MP_AHB4ENSETR   *(volatile unsigned int *)0x50000A28
/*
typedef struct{
	volatile unsigned int MODER;
	volatile unsigned int OTYPER;
	volatile unsigned int OSPEEDR;
	volatile unsigned int PUPDR;
	volatile unsigned int IDR;
	volatile unsigned int ODR;
	volatile unsigned int BSRR;
}gpioReg_t;
#define  GPIOE   (gpioReg_t *)0x50006000
#define  GPIOF   (gpioReg_t *)0x50007000
*/
// 让一个16位的数，每一位代表一个引脚，
// U : 无符号的整数
#define  GPIO_PIN_0   0x0001U
#define  GPIO_PIN_1   0x0002U
#define  GPIO_PIN_2   0x0004U
#define  GPIO_PIN_3   0x0008U
#define  GPIO_PIN_4   0x0010U
#define  GPIO_PIN_5   0x0020U
#define  GPIO_PIN_6   0x0040U
#define  GPIO_PIN_7   0x0080U
#define  GPIO_PIN_8   0x0100U
#define  GPIO_PIN_9   0x0200U
#define  GPIO_PIN_10  0x0400U
#define  GPIO_PIN_11  0x0800U
#define  GPIO_PIN_12  0x1000U
#define  GPIO_PIN_13  0x2000U
#define  GPIO_PIN_14  0x4000U
#define  GPIO_PIN_15  0x8000U

// 封装GPIO的模式
typedef enum{
	GPIO_INPUT = 0,
	GPIO_OUTPUT ,
	GPIO_AF ,
	GPIO_ANALOG, 
} gpio_mode_t;

typedef enum {
	GPIO_PP = 0,
	GPIO_OD,
}gpio_type_t;

typedef enum {
	GPIO_LOW = 0,
	GPIO_MEDIUM,
	GPIO_HIGH,
	GPIO_VERY_HIGH,
} gpio_speed_t;

typedef enum {
	GPIO_NOPUPD = 0,
	GPIO_UP,
	GPIO_DOWN,
} gpio_pupd_t;

typedef enum {
	GPIO_RESET = 0,
	GPIO_SET,
} gpio_status_t;

// gpio引脚初始化的结构体
typedef struct {
	unsigned int pin;  // 哪个GPIO引脚
	gpio_mode_t mode;  // GPIO引脚的模式
	gpio_type_t type;  // GPIO引脚的类型
	gpio_speed_t speed; // GPIO引脚的速度
	gpio_pupd_t pupd;   // GPIO上拉和下拉电阻
}gpio_init_t;



/*
 * 功能：gpio引脚初始化的函数
 * 		初始化函数解析函数传递的实参值完成对引脚的初始化
 * 参数： 
 * 	@ gpios : 哪组GPIO引脚
 * 	@ init : 引脚初始化结构体
 * 返回值：无
 * */
void hal_gpio_init(gpio_t *gpios, gpio_init_t *init);

// 功能： 设置gpio引脚输出高低电平
// 参数：
// 	@ gpios ： GPIO引脚的组
// 	@ pin : 那个gpio引脚
// 	@ statu: 引脚的输出状态
// 返回值：无
void hal_gpio_write(gpio_t *gpios, 
			unsigned int pin, gpio_status_t statu);
// 功能： 检测gpio引脚输入高低电平
// 参数：
// 	@ gpios ： GPIO引脚的组
// 	@ pin : 那个gpio引脚
// 返回值：引脚的输入的的状态
gpio_status_t hal_gpio_read(gpio_t * gpios, 
		unsigned int pin);


#endif // __GPIO_H__
